"""实体类定义"""

from dataclasses import dataclass,field
import uuid
from config.warehouse_config import *
from enum import Enum


@dataclass
class Obj:
    """所有类型的父类，定义基本的属性"""
    id:str=field(default_factory=lambda: f"obj_{uuid.uuid4().hex[:5]}")
    type:str=field(default="obj")
    name:str=field(default="")
    capacity:float=field(default=1)#容量
    warning_capacity:float=field(default=1)#预警容量
    infos:dict=field(default_factory=dict)#预留的一个字典，存储一些信息



    

@dataclass
class Goods(Obj):
    """货物，定义货物的属性"""
    id:str=field(default="")
    # 货物类型
    type:str=field(default="normal")#danger normal cold
    # 出口类型
    exit_No:str=field(default="0")
    
    # 状态列表
    status_list:list=field(default_factory=list)



# 停靠站 入站和出站
@dataclass
class InTruckStation(Obj):
    """入站，卡车停靠站"""
    id:str=field(default_factory=lambda: f"in_truck_station_{uuid.uuid4().hex[:5]}")
    # 停靠站类型
    type:str=field(default="station")
    # 停靠站名称
    name:str=field(default="station")
    # 停靠站容量
    capacity:float=field(default=STATION_CAPACITY_IN)
    # 预警容量
    warning_capacity:float=field(default=STATION_CAPACITY_IN_WARNING)

@dataclass
class OutTruckStation(Obj):
    """出站，卡车停靠站"""
    id:str=field(default_factory=lambda: f"out_truck_station_{uuid.uuid4().hex[:5]}")
    # 停靠站类型
    type:str=field(default="station")
    # 停靠站名称
    name:str=field(default="station")
    # 停靠站容量
    capacity:float=field(default=STATION_CAPACITY_OUT)
    # 预警容量
    warning_capacity:float=field(default=STATION_CAPACITY_OUT_WARNING)


# 载具定义
@dataclass
class Vehicle(Obj):
    """载具父类，定义基本的属性"""
    id:str=field(default_factory=lambda: f"vehicle_{uuid.uuid4().hex[:5]}")
    # 载具类型
    type:str=field(default="vehicle")
    # 载具名称
    name:str=field(default="vehicle")
    # 移动速度
    speed:float=field(default=1)
    # 装卸货时间
    load_time:float=field(default=1)
    # 货物列表
    goods_list:list=field(default_factory=list)


@dataclass
class Truck(Vehicle):
    """卡车子类，定义卡车的属性"""
    id:str=field(default_factory=lambda: f"truck_{uuid.uuid4().hex[:5]}")
    # 载具类型
    type:str=field(default="truck")
    # 载具名称
    name:str=field(default="truck")
    # 当前状态
    status:str=field(default="spawn")#spawn waiting loading unloading finish
    # 载具容量
    capacity:float=field(default=TRUCK_CAPACITY)
    # 预警容量
    warning_capacity:float=field(default=TRUCK_WARNING_CAPACITY)
    # 载具移动速度
    speed:float=field(default=TRUCK_SPEED)
    # 载具装卸货时间
    load_time:float=field(default=TRUCK_LOAD_TIME)
    


@dataclass
class AGV(Vehicle):
    """AGV子类，定义AGV的属性"""
    id:str=field(default_factory=lambda: f"agv_{uuid.uuid4().hex[:5]}")
    # 载具类型
    type:str=field(default="agv")
    # 载具名称
    name:str=field(default="agv")
    # 是否被占用
    is_occupied:bool=field(default=False)
    # 载具容量
    capacity:float=field(default=AGV_CAPACITY)
    # 预警容量
    warning_capacity:float=field(default=AGV_WARNING_CAPACITY)
    # 载具移动速度
    speed:float=field(default=AGV_SPEED)
    # 载具装卸货时间
    load_time:float=field(default=AGV_LOAD_TIME)


@dataclass
class Enter(Obj):
    """入口，定义入口的属性"""
    id:str=field(default_factory=lambda:f"enter_{uuid.uuid4().hex[:5]}")
    # 入口类型
    type:str=field(default="enter")
    # 入口名称
    name:str=field(default="enter")
    # 是否被占用
    is_occupied:bool=field(default=False)


@dataclass
class Exit(Obj):
    """出口，定义出口的属性"""
    id:str=field(default_factory=lambda: f"exit_{uuid.uuid4().hex[:5]}")
    # 出口类型
    type:str=field(default="exit")
    # 出口名称
    name:str=field(default="exit")
    # 是否被占用
    is_occupied:bool=field(default=False)
    # 货物列表
    goods_list:list=field(default_factory=list)


@dataclass
class TypePool(Obj):
    """分类池，筛选出具体所属分类池的类"""
    id:str=field(default_factory=lambda: f"type_pool_{uuid.uuid4().hex[:5]}")
    # 停靠站类型
    type:str=field(default="type_pool")
    # 停靠站名称
    name:str=field(default="type_pool")
    # 停靠站容量
    capacity:float=field(default=TYPE_POOL_CAPACITY)
    # 预警容量
    warning_capacity:float=field(default=TYPE_POOL_WARNING)
    # 货物列表
    goods_list:list=field(default_factory=list)


@dataclass
class NormalTypePool(Obj):
    """普通分类池，定义普通分类池的属性"""
    id:str=field(default_factory=lambda: f"normal_type_pool_{uuid.uuid4().hex[:5]}")
    # 停靠站类型
    type:str=field(default="type_pool")
    # 停靠站名称
    name:str=field(default="type_pool")
    # 停靠站容量
    capacity:float=field(default=NORMAL_TYPE_POOL_CAPACITY)
    # 预警容量
    warning_capacity:float=field(default=NORMAL_TYPE_POOL_WARNING)
    # 货物列表
    goods_list:list=field(default_factory=list)
@dataclass
class DangerousTypePool(Obj):
    """危险品分类池，定义危险品分类池的属性"""
    id:str=field(default_factory=lambda: f"dangerous_type_pool_{uuid.uuid4().hex[:5]}")
    # 停靠站类型
    type:str=field(default="type_pool")
    # 停靠站名称
    name:str=field(default="type_pool")
    # 停靠站容量
    capacity:float=field(default=DANGEROUS_TYPE_POOL_CAPACITY)
    # 预警容量
    warning_capacity:float=field(default=DANGEROUS_TYPE_POOL_WARNING)
    # 货物列表
    goods_list:list=field(default_factory=list)
@dataclass
class RefrigeratedTypePool(Obj):
    """冷藏分类池，定义冷藏分类池的属性"""
    id:str=field(default_factory=lambda: f"refrigerated_type_pool_{uuid.uuid4().hex[:5]}")
    # 停靠站类型
    type:str=field(default="type_pool")
    # 停靠站名称
    name:str=field(default="type_pool")
    # 停靠站容量
    capacity:float=field(default=REFRIGERATED_TYPE_POOL_CAPACITY)
    # 预警容量
    warning_capacity:float=field(default=REFRIGERATED_TYPE_POOL_WARNING)
    # 货物列表
    goods_list:list=field(default_factory=list)


@dataclass
class AGVPickupPoint(Obj):
    """AGV取货点，定义AGV取货点的属性"""
    id:str=field(default_factory=lambda: f"agv_pickup_point_{uuid.uuid4().hex[:5]}")
    # 取货点类型
    type:str=field(default="agv_pickup_point")
    # 取货点名称
    name:str=field(default="agv_pickup_point")
    # 所属分类池
    type_pool_id:str=field(default="")
    # 所属出口
    exit_id:str=field(default="")
    # 取货点容量
    capacity:float=field(default=AGV_PICKUP_POINT_CAPACITY)
    # 取货点预警容量
    warning_capacity:float=field(default=AGV_PICKUP_POINT_WARNING)
    # 货物列表
    goods_list:list=field(default_factory=list)
    # 是否被占用
    is_occupied:bool=field(default=False)



@dataclass
class MachineFilterPool(Obj):
    """分类机器，定义分类机器的属性"""
    id:str=field(default_factory=lambda: f"sort_machine_{uuid.uuid4().hex[:5]}")
    # 分类机器类型
    type:str=field(default="sort_machine")
    # 分类机器名称
    name:str=field(default="sort_machine")
    # 分类机器容量
    capacity:float=field(default=MACHINE_FILTER_POOL_CAPACITY)
    # 预警容量
    warning_capacity:float=field(default=MACHINE_FILTER_POOL_WARNING)
    # 识别比例
    recognition_ratio:float=field(default=MACHINE_RECOGNITION_RATIO)

@dataclass
class ManFilterPool(Obj):
    """人工筛选池，定义人工筛选池的属性"""
    id:str=field(default_factory=lambda: f"man_filter_pool_{uuid.uuid4().hex[:5]}")
    # 人工筛选池类型
    type:str=field(default="man_filter_pool")
    # 人工筛选池名称
    name:str=field(default="man_filter_pool")
    # 人工筛选池容量
    capacity:float=field(default=MAN_FILTER_POOL_CAPACITY)
    # 预警容量
    warning_capacity:float=field(default=MAN_FILTER_POOL_WARNING)

